#include "mainwidget.h"
#include "ui_mainwidget.h"
#include "debug.h"
#include "selfinfowidget.h"
#include "sessiondetailwidget.h"
#include "groupsessiondetailwidget.h"
#include "model/data.h"
#include "addfrienddialog.h"

#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>

MainWidget *MainWidget::instance = nullptr;

///
/// \brief MainWidget::getInstance 获取主窗口单例
/// \remark 1. 实例化主窗体时不传入参数表示以桌面为父窗口
/// \remark 2. 不加锁和双重校验判定是因为主窗体在程序启动的时候已经完成实例创建，不存在线程安全问题
/// \return 返回主窗口单例指针
///
MainWidget *MainWidget::getInstance()
{
    if (nullptr == instance) {
        instance = new MainWidget();
    }
    return instance;
}

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);

    initMainWindow();
    initWindowLeft();
    initWindowMid();
    initWindowRight();
    initSignalSlot();
}

MainWidget::~MainWidget()
{
    delete ui;
}

void MainWidget::switchSession(const QString &userId)
{
    // 先不进行
    // TODO???
}

///
/// \brief MainWidget::initMainWindow 初始化主窗口
/// \remark
/// 初始化主窗口的三个主要区域：
/// 1. windowLeft - 左侧边栏，宽度固定为70px，深灰色背景
/// 2. windowMid - 中间区域，宽度固定为310px，浅灰色背景
/// 3. windowRight - 右侧主区域，最小宽度为650px，浅色背景
///
/// \param 设置窗口标题为"我的聊天室"，并设置窗口图标
/// \param 使用水平布局(QHBoxLayout)管理三个区域，布局无间距和边距
///
void MainWidget::initMainWindow()
{
    windowLeft = new QWidget();
    windowLeft->setFixedWidth(70);
    windowLeft->setStyleSheet("QWidget { background-color : rgb(46, 46, 46); }");

    windowMid = new QWidget();
    windowMid->setFixedWidth(310);
    windowMid->setStyleSheet("QWidget { background-color : rgb(247, 247, 247); }");

    windowRight = new QWidget();
    windowRight->setMinimumWidth(800); // 最小高度TODO???
    windowRight->setStyleSheet("QWidget { background-color : rgb(245, 245, 245); }");

    QHBoxLayout *layout = new QHBoxLayout();
    layout->setSpacing(0); // 布局管理器内部元素之间的间距
    layout->setContentsMargins(0, 0, 0, 0); //布局管理器内部元素距离四个边界的边距
    layout->addWidget(windowLeft);
    layout->addWidget(windowMid);
    layout->addWidget(windowRight);

    this->setWindowTitle("我的聊天室");
    this->setWindowIcon(QIcon(":/resource/image/logo.png"));
    this->setLayout(layout);
    this->resize(1300, 800);
    this->setMinimumWidth(1180);
    this->setMinimumHeight(600);
    this->setAttribute(Qt::WA_OpaquePaintEvent);
}

///
/// \brief MainWidget::initWindowLeft 初始化主窗口左侧导航栏
/// \remark
/// 初始化左侧导航栏，包含：
/// - 用户头像按钮（45x45，默认头像）
/// - 会话标签按钮（激活状态）
/// - 好友标签按钮（非激活状态）
/// - 申请标签按钮（非激活状态）
/// - 垂直布局（间距20，上边距50，顶部居中）
///
void MainWidget::initWindowLeft()
{
    userAvatarBtn = new QPushButton();
    userAvatarBtn->setFlat(true);
    userAvatarBtn->setFixedSize(45, 45);
    userAvatarBtn->setIconSize(QSize(45, 45));
    userAvatarBtn->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
    QString userAvatarBtnStyle = "QPushButton { background-color : transparent; border : none; }";
    userAvatarBtn->setStyleSheet(userAvatarBtnStyle);
    userAvatarBtn->setFocusPolicy(Qt::ClickFocus);

    sessionTabBtn = new QPushButton();
    sessionTabBtn->setFlat(true);
    sessionTabBtn->setFixedSize(45, 45);
    sessionTabBtn->setIconSize(QSize(30, 30));
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    QString sessionTabBtnStyle = "QPushButton { background-color : transparent; border : none; }";
    sessionTabBtn->setStyleSheet(sessionTabBtnStyle);
    sessionTabBtn->setFocusPolicy(Qt::ClickFocus);

    friendTabBtn = new QPushButton();
    friendTabBtn->setFlat(true);
    friendTabBtn->setFixedSize(45, 45);
    friendTabBtn->setIconSize(QSize(30, 30));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    QString friendTabBtnStyle = "QPushButton { background-color : transparent; border : none; }";
    friendTabBtn->setStyleSheet(friendTabBtnStyle);
    friendTabBtn->setFocusPolicy(Qt::ClickFocus);

    applyTabBtn = new QPushButton();
    applyTabBtn->setFlat(true);
    applyTabBtn->setFixedSize(45, 45);
    applyTabBtn->setIconSize(QSize(30, 30));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    QString applyTabBtnStyle = "QPushButton { background-color : transparent; border : none; }";
    applyTabBtn->setStyleSheet(applyTabBtnStyle);
    applyTabBtn->setFocusPolicy(Qt::ClickFocus);

    QVBoxLayout *layout = new QVBoxLayout();
    layout->setSpacing(20);
    layout->setContentsMargins(0, 50, 0, 0);
    layout->addWidget(userAvatarBtn, 1, Qt::AlignTop | Qt::AlignHCenter);
    layout->addWidget(sessionTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);
    layout->addWidget(friendTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);
    layout->addWidget(applyTabBtn, 1, Qt::AlignTop | Qt::AlignHCenter);
    layout->addStretch(20);

    windowLeft->setLayout(layout);
}

void MainWidget::initWindowMid()
{
    searchEdit = new QLineEdit();
    searchEdit->setFixedHeight(30);
    searchEdit->setPlaceholderText("搜索");
    QString searchEditStyleSheet = "QLineEdit { border-radius : 5px; background-color : rgb(226, 226, 226); }";
    searchEdit->setStyleSheet(searchEditStyleSheet);

    addFriendBtn = new QPushButton();
    addFriendBtn->setFixedSize(QSize(30, 30));
    addFriendBtn->setIconSize(QSize(20, 20));
    addFriendBtn->setIcon(QIcon(":/resource/image/cross.png"));
    addFriendBtn->setFlat(true);  // 设置为平面样式
    QString addFriendBtnStyleSheet = "QPushButton { border-radius : 5px; background-color : rgb(226, 226, 226); border : none; }";
    addFriendBtnStyleSheet += "QPushButton:pressed { background-color : rgb(240, 240, 240); }";
    addFriendBtn->setStyleSheet(addFriendBtnStyleSheet);
    addFriendBtn->setFocusPolicy(Qt::ClickFocus);

    sessionFriendArea = new SessionFriendArea();

    QGridLayout *layout = new QGridLayout();
    layout->setSpacing(0);
    layout->setContentsMargins(0, 0, 0, 0);
    // 第一行
    layout->addWidget(new QWidget(), 0, 0, 1, 5);
    layout->setRowMinimumHeight(0, 20);
    // 第二行
    QWidget *space10 = new QWidget();
    space10->setFixedWidth(10);
    QWidget *space12 = new QWidget();
    space12->setFixedWidth(10);
    QWidget *space14 = new QWidget();
    space14->setFixedWidth(10);
    layout->addWidget(space10, 1, 0);
    layout->addWidget(searchEdit, 1, 1);           // 位于第1行第1列
    layout->addWidget(space12, 1, 2);
    layout->addWidget(addFriendBtn, 1, 3);         // 位于第1行第3列
    layout->addWidget(space14, 1, 4);
    layout->setRowMinimumHeight(1, 30);            // 固定行高
    // 第三行
    layout->addWidget(new QWidget(), 2, 1);
    layout->setRowMinimumHeight(2, 10);
    // 第四行：主内容区域（占据剩余空间）
    layout->addWidget(sessionFriendArea, 3, 0, 1, 5);           // 跨5列，占据整个宽度
    layout->setRowStretch(3, 1);                   // 关键：让这一行伸缩填充剩余空间

    windowMid->setLayout(layout);
}

void MainWidget::initWindowRight()
{
    // 标题栏_左侧标题展示Label
    QLabel *sessionTitleLabel = new QLabel();
#if TEST_UI
#if TEST_UI_SESSIONTITLE
    // 临时测试代码，后续使用从服务器设置的代码来设置
    sessionTitleLabel->setText("这是会话标题");
#endif
#endif
    QString sessionTitleLabelStyle = "QLabel { font-size : 22px; background-color : rgb(245, 245, 245); border-bottom : 1px solid rgb(230, 230, 230); }";
    sessionTitleLabel->setStyleSheet(sessionTitleLabelStyle);

    // 标题栏_右侧详细信息获取按钮
    extraBtn = new QPushButton();
    extraBtn->setFixedSize(QSize(30, 30));
    extraBtn->setIconSize(QSize(20, 20));
    extraBtn->setIcon(QIcon(":/resource/image/more.png"));
    QString extraBtnStyle = "QPushButton { background-color : rgb(245, 245, 245); border : none; }";
    extraBtnStyle += "QPushButton:hover { background-color : rgb(235, 235, 235); }";
    extraBtnStyle += "QPushButton:pressed { background-color : rgb(220, 220, 220); }";
    extraBtn->setStyleSheet(extraBtnStyle);
    extraBtn->setFocusPolicy(Qt::ClickFocus);

    // 标题栏_水平布局管理器
    QHBoxLayout *hLayout = new QHBoxLayout();
    hLayout->setSpacing(0);
    hLayout->setContentsMargins(10, 0, 10, 0);
    hLayout->addWidget(sessionTitleLabel);
    hLayout->addWidget(extraBtn);

    // 标题栏_标题栏窗体
    QWidget *titleWidget = new QWidget();
    titleWidget->setFixedHeight(62);
    titleWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    titleWidget->setLayout(hLayout);
    titleWidget->setObjectName("titleWidget");
    QString titleWidgetStyle = "#titleWidget { border-bottom : 1px solid rgb(230, 230, 230); border-left : 1px solid rgb(230, 230, 230); }";
    titleWidget->setStyleSheet(titleWidgetStyle);

    // 中间消息展示区
    messageShowArea = new MessageShowArea();

    // 下方消息编辑区
    messageEditArea = new MessageEditArea();

    // 主窗体右侧子窗体_垂直布局管理器
    QVBoxLayout *vLayout = new QVBoxLayout();
    vLayout->setSpacing(0);
    vLayout->setContentsMargins(0, 0, 0, 0);
    vLayout->setAlignment(Qt::AlignTop);
    vLayout->addWidget(titleWidget);
    vLayout->addWidget(messageShowArea, 1);
    vLayout->addWidget(messageEditArea, 0, Qt::AlignBottom);

    // 主窗体右侧子窗体_设置垂直布局管理器
    windowRight->setLayout(vLayout);
}

void MainWidget::initSignalSlot()
{
    /////////////////////////////////////////////
    /// 处理标签页按钮样式切换和列表加载问题
    /////////////////////////////////////////////
    connect(sessionTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToSession);
    connect(friendTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToFriend);
    connect(applyTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToApply);

    /////////////////////////////////////////////
    /// 点击自己的头像, 弹出对话框显示个人主页
    /////////////////////////////////////////////
    connect(userAvatarBtn, &QPushButton::clicked, this, [=]() {
        SelfInfoWidget* selfInfoWidget = new SelfInfoWidget(this);
        selfInfoWidget->exec();		// 弹出模态对话框
        // selfInfoWidget->show();     // 弹出非模态
    });

    /////////////////////////////////////////////
    /// 点击会话详情按钮, 弹出会话详情窗口
    /////////////////////////////////////////////
    connect(extraBtn, &QPushButton::clicked, this, [=]() {
#if TEST_UI
        auto result = QMessageBox::warning(this, "UI测试", "是否启用群聊会话详情页?", QMessageBox::Ok | QMessageBox::Cancel);
        if (result == QMessageBox::Ok)
        {
            GroupSessionDetailWidget* groupSessionDetailWidget = new GroupSessionDetailWidget(this);
            groupSessionDetailWidget->exec();
        }
        else
        {
            SessionDetailWidget* sessionDetailWidget = new SessionDetailWidget(this, model::UserInfo());
            sessionDetailWidget->exec();
        }
#else
            ChatSessionInfo* chatSessionInfo = dataCenter->findChatSessionById(dataCenter->getCurrentChatSessionId());
            if (chatSessionInfo == nullptr) {
                LOG() << "当前会话不存在, 无法弹出会话详情对话框";
                return;
            }

            bool isSingleChat = chatSessionInfo->userId != "";

            if (isSingleChat) {
                // 单聊, 弹出这个窗口
                UserInfo* userInfo = dataCenter->findFriendById(chatSessionInfo->userId);
                if (userInfo == nullptr) {
                    LOG() << "单聊会话对应的用户不存在, 无法弹出会话详情窗口";
                    return;
                }
                SessionDetailWidget* sessionDetailWidget = new SessionDetailWidget(this, *userInfo);
                sessionDetailWidget->exec();
            } else {
                // 群聊, 弹出另一个窗口
                GroupSessionDetailWidget* groupSessionDetailWidget = new GroupSessionDetailWidget(this);
                groupSessionDetailWidget->exec();
            }
#endif
    });

    /////////////////////////////////////////////
    /// 点击添加好友按钮, 弹出添加好友窗口
    /////////////////////////////////////////////
    connect(addFriendBtn, &QPushButton::clicked, this, [=]() {
        AddFriendDialog* addFriendDialog = new AddFriendDialog(this);
        addFriendDialog->exec();
    });

}

void MainWidget::switchTabToSession()
{
    activeTab = SESSION_LIST;
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    loadSessionList(); // TODO???
}

void MainWidget::switchTabToFriend()
{
    activeTab = FRIEND_LIST;
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    loadFriendList(); // TODO???
}

void MainWidget::switchTabToApply()
{
    activeTab = APPLY_LIST;
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_active.png"));
    loadApplyList(); // TODO???
}

void MainWidget::loadSessionList()
{

}

void MainWidget::loadFriendList()
{

}

void MainWidget::loadApplyList()
{

}
